<?php

namespace Wgx\Admin\Com\Crud\EditPageInput;

use Wgx\Admin\Com\Crud\EditPageInputBase;

class InputSelectOnline extends EditPageInputBase
{
    /** @var string */
    private $url;
    /** @var string */
    private $searchFieldName;
    /** @var string */
    private $origValueHtml;
    /** @var bool */
    private $isRequired;
    /** @var null|string */
    private $placeholder;
    /** @var null|string */
    private $width;
    /** @var null|string */
    private $itemConverter;
    /** @var int */
    private $limit;
    /** @var null|string */
    private $orderFieldName;
    /** @var int */
    private $orderDirection;
    /** @var null|string */
    private $className;
    /** @var null|string */
    private $specParam;

    /**
     * InputSelectOnline constructor.
     * @param string $url
     * @param string $searchFieldName - 实时搜索 select 的搜索字段, 用于和后端对接, 例如：实时搜索 select 搜索其实是要对 name 进行搜索，但是 select2 不会传递 name 而是传递 term 字段给后端，如果后端是一个通用的后端，应该要求传递 name, 这里设置 $searchFieldName = name 就可以让前端做一下改变，传递 name 而不是 term
     * @param mixed $origValue - 原值
     * @param string $origValueHtml - 默认选中的值的文本展示，最好和 select 的 option 展示的文本一致
     * @param bool $isRequired
     * @param null|string $placeholder
     * @param null|string $width - 透传给 select2 的 width 选项，说明请参考 select2 的 width 选项 的文档
     * @param null|string $itemConverter - 服务器返回给 select2 的数据不一定符合 select2 要求的数据格式，其它数据格式要求已经由前后端的约定搞定，现在剩下列表项(item) 这一级别需要指定一个 converter : function (item) { return item; }, js 匿名函数, 传入原始 item, 要求返回符合 select2 要求的 item{id(require),text(require),selected(bool,optional),disabled(bool,optional)}, $itemConverter = null 时直接给 select2 原始 item, 不转换
     * @param int $limit - 实时搜索 select 的分页参数 limit
     */
    public function __construct($url, $searchFieldName, $origValue, $origValueHtml, $isRequired = false, $placeholder = null, $width = null, $itemConverter = null, $limit = 10)
    {
        $this->url = $url;
        $this->searchFieldName = $searchFieldName;
        $this->origValue = $origValue;
        $this->origValueHtml = $origValueHtml;
        $this->isRequired = $isRequired;
        $this->placeholder = $placeholder;
        $this->width = $width;
        $this->itemConverter = $itemConverter;
        $this->limit = $limit;
    }

    /**
     * @inheritDoc
     */
    public function getInputType()
    {
        return self::InputSelectOnline;
    }

    /**
     * @return string
     */
    public function getUrl()
    {
        return $this->url;
    }

    /**
     * @param string $url
     * @return InputSelectOnline
     */
    public function setUrl($url)
    {
        $this->url = $url;
        return $this;
    }

    /**
     * 实时搜索 select 的搜索字段, 用于和后端对接,
     * 例如：实时搜索 select 搜索其实是要对 name 进行搜索，但是 select2 不会传递 name 而是传递 term 字段给后端，
     * 如果后端是一个通用的后端，应该要求传递 name, 这里设置 $searchFieldName = name 就可以让前端做一下改变，传递 name 而不是 term
     * @return string
     */
    public function getSearchFieldName()
    {
        return $this->searchFieldName;
    }

    /**
     * @param string $searchFieldName - 实时搜索 select 的搜索字段, 用于和后端对接, 例如：实时搜索 select 搜索其实是要对 name 进行搜索，但是 select2 不会传递 name 而是传递 term 字段给后端，如果后端是一个通用的后端，应该要求传递 name, 这里设置 $searchFieldName = name 就可以让前端做一下改变，传递 name 而不是 term
     * @return InputSelectOnline
     */
    public function setSearchFieldName($searchFieldName)
    {
        $this->searchFieldName = $searchFieldName;
        return $this;
    }

    /**
     * 默认选中的值的文本展示，最好和 select 的 option 展示的文本一致
     * @return string
     */
    public function getOrigValueHtml()
    {
        return $this->origValueHtml;
    }

    /**
     * @param string $origValueHtml - 默认选中的值的文本展示，最好和 select 的 option 展示的文本一致
     * @return InputSelectOnline
     */
    public function setOrigValueHtml($origValueHtml)
    {
        $this->origValueHtml = $origValueHtml;
        return $this;
    }

    /**
     * @inheritDoc
     */
    public function getIsRequired()
    {
        return $this->isRequired;
    }

    /**
     * @param bool $isRequired
     * @return InputSelectOnline
     */
    public function setIsRequired($isRequired)
    {
        $this->isRequired = $isRequired;
        return $this;
    }

    /**
     * @return string|null
     */
    public function getPlaceholder()
    {
        return $this->placeholder;
    }

    /**
     * @param string|null $placeholder
     * @return InputSelectOnline
     */
    public function setPlaceholder($placeholder)
    {
        $this->placeholder = $placeholder;
        return $this;
    }

    /**
     * 透传给 select2 的 width 选项，说明请参考 select2 的 width 选项 的文档
     * @return string|null
     */
    public function getWidth()
    {
        return $this->width;
    }

    /**
     * @param string|null $width - 透传给 select2 的 width 选项，说明请参考 select2 的 width 选项 的文档
     * @return InputSelectOnline
     */
    public function setWidth($width)
    {
        $this->width = $width;
        return $this;
    }

    /**
     * 服务器返回给 select2 的数据不一定符合 select2 要求的数据格式，
     * 其它数据格式要求已经由前后端的约定搞定，现在剩下列表项(item) 这一级别需要指定一个
     * converter : function (item) { return item; }, js 匿名函数, 传入原始 item,
     * 要求返回符合 select2 要求的 item{id(require),text(require),selected(bool,optional),disabled(bool,optional)},
     * $itemConverter = null 时直接给 select2 原始 item, 不转换
     * @return string|null
     */
    public function getItemConverter()
    {
        return $this->itemConverter;
    }

    /**
     * @param string|null $itemConverter - 服务器返回给 select2 的数据不一定符合 select2 要求的数据格式，其它数据格式要求已经由前后端的约定搞定，现在剩下列表项(item) 这一级别需要指定一个 converter : function (item) { return item; }, js 匿名函数, 传入原始 item, 要求返回符合 select2 要求的 item{id(require),text(require),selected(bool,optional),disabled(bool,optional)}, $itemConverter = null 时直接给 select2 原始 item, 不转换
     * @return InputSelectOnline
     */
    public function setItemConverter($itemConverter)
    {
        $this->itemConverter = $itemConverter;
        return $this;
    }

    /**
     * 实时搜索 select 的分页参数 limit
     * @return int
     */
    public function getLimit()
    {
        return $this->limit;
    }

    /**
     * @param int $limit - 实时搜索 select 的分页参数 limit
     * @return InputSelectOnline
     */
    public function setLimit($limit)
    {
        $this->limit = $limit;
        return $this;
    }

    /**
     * 实时搜索 select 是请求服务器进行搜索，服务器可以排序，这个就是指定服务器排序使用的字段
     * @return string|null
     */
    public function getOrderFieldName()
    {
        return $this->orderFieldName;
    }

    /**
     * @param string|null $orderFieldName - 实时搜索 select 是请求服务器进行搜索，服务器可以排序，这个就是指定服务器排序使用的字段
     * @return InputSelectOnline
     */
    public function setOrderFieldName($orderFieldName)
    {
        $this->orderFieldName = $orderFieldName;
        return $this;
    }

    /**
     * 实时搜索 select 是请求服务器进行搜索，服务器可以排序，这个就是指定服务器排序使用的方向 (0:降序, 1:升序)
     * @return int
     */
    public function getOrderDirection()
    {
        return $this->orderDirection;
    }

    /**
     * @param int $orderDirection - 实时搜索 select 是请求服务器进行搜索，服务器可以排序，这个就是指定服务器排序使用的方向 (0:降序, 1:升序)
     * @return InputSelectOnline
     */
    public function setOrderDirection($orderDirection)
    {
        $this->orderDirection = $orderDirection;
        return $this;
    }

    /**
     * 额外指定的 class, 指定在 wrapper 上, 通过 .className select 来设置 select 的样式
     * @return string|null
     */
    public function getClassName()
    {
        return $this->className;
    }

    /**
     * @param string|null $className - 额外指定的 class, 指定在 wrapper 上, 通过 .className select 来设置 select 的样式
     * @return InputSelectOnline
     */
    public function setClassName($className)
    {
        $this->className = $className;
        return $this;
    }

    /**
     * 额外指定的参数, 指定在 wrapper 上
     * @return string|null
     */
    public function getSpecParam()
    {
        return $this->specParam;
    }

    /**
     * @param string|null $specParam - 额外指定的参数, 指定在 wrapper 上
     * @return InputSelectOnline
     */
    public function setSpecParam($specParam)
    {
        $this->specParam = $specParam;
        return $this;
    }
}